package manejoDB;

import java.sql.Array;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;

/**
 *
 * @author Veko
 */
public class AdministradorDBOrden {

    private ConexionDB abm_consulta;

    
    
    public AdministradorDBOrden() throws SQLException {
        this.abm_consulta = new ConexionDB();
    }

     /**
     * Conexion 
     *
     * @throws SQLException
     */

    public Boolean Conectar() throws SQLException {
        return this.abm_consulta.conectar();
    }

    public void desconectar() throws SQLException {
        this.abm_consulta.cierraConexion();
    }
    
    
     /**
     * AltaOrden:
     * Permite elementos null, el código de cantidades es Serial no se especifica
     * @param idCliente, fechaHoraPedido, fechaPactada, horaDesdePactada,
     * @param horaHastaPactada,estadoPedido,montoTotal,montoAbonado,
     * @param montoAdeudado,delivery
     * @throws SQLException
     */
    
    public void setNuevaOrden(Integer idCliente, String fechaHoraPedido,
            String fechaPactada, String horaDesdePactada,
            String horaHastaPactada, String estadoPedido,
            Double montoTotal, Double montoAbonado,
            Double montoAdeudado, boolean delivery) throws SQLException {

            /*this.abm_consulta.insertar("INSERT INTO cantidades(idcliente, "
                    + "fechahorapedido, fechahoraentrega, fechapactada,horapactadadesde, "
                    + "horapactadahasta, estadoorden, montototal, montoabonado, "
                    + "montoadeudado, delivery, lugardealmacenajepedidolisto) VALUES ("+idCliente+"," +fechaHoraPedido+","+ null+","+ fechaPactada+"," +  horaDesdePactada+"," +horaHastaPactada+","+ estadoPedido +","+ montoTotal+","+ montoAbonado+"," montoAdeudado+","+ delivery+","+null +");");
                    * */
        
        this.abm_consulta.insertar("INSERT INTO orden(idcliente, fechahorapedido, "
                + "fechahoraentrega, fechapactada,horapactadadesde, horapactadahasta, "
                + "estadoorden, montototal, montoabonado, montoadeudado, delivery, "
                + "lugardealmacenajepedidolisto) VALUES (" + idCliente + ",'" + 
                fechaHoraPedido + "'," + null + ",'" + fechaPactada
                + "','" + horaDesdePactada + "','" + horaHastaPactada + "','" + estadoPedido + "' , " + montoTotal
                + " ," + montoAbonado + " , " + montoAdeudado + " , " + delivery + " , " + null + ");");
   }
    
    

// getters
    public Integer getNuevoCodigoOrden() throws SQLException {
        Integer retorno = null;
        int i=0;
       // try {

            ResultSet consulta = this.abm_consulta.consulta("Select idorden from orden;");
            while (consulta.next()) {
                i++;/*
                retorno = consulta.getInt("idOrden");
            }

        } catch (SQLException ex) {
            Logger.getLogger(AdministradorDBServicio.class.getName()).log(Level.SEVERE, null, ex);
        }
        if (retorno == null) {
            return 1;*/
        }
        //return retorno + 1;
        return i+1;
    }

    public Integer getCodCliente(Integer codOrden) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta("select idCliente,estadoOrden from orden where idorden = " + codOrden + ";  ");
        Integer retorno = null;
        while (consulta.next()) {
            if (!consulta.getString("estadoOrden").toString().equalsIgnoreCase("ANULADA")) {
                retorno = consulta.getInt("idCliente");
            }
        }
        return retorno;
    }

    /**
     * @param codigoOrden
     * @return
     * @throws SQLException
     */
    public String getFechaHoraPedido(Integer codigoOrden) throws SQLException {
        String retorno = null;
        /*ResultSet consulta = this.abm_consulta.consulta("Select fechahorapedido"
                + " from Orden where idOrden=" + codigoOrden + " and"
                + "lower(estadoOrden)<>'anulada';");*/
        ResultSet consulta = this.abm_consulta.consulta("Select fechahorapedido"
                + " from Orden where idOrden=" + codigoOrden+" and "
                + "upper(estadoOrden)<>'ANULADA';");
        while (consulta.next()) {
            retorno = consulta.getString("fechahorapedido");
            
        }
        return retorno;
    }

    public String getFechaPactada(Integer codigoOrden) throws SQLException {
        String retorno = null;
        ResultSet consulta = this.abm_consulta.consulta("Select fechaPactada"
                + " from orden where idOrden=" + codigoOrden + " and "
                + "upper(estadoOrden)<>'ANULADA';");
        while (consulta.next()) {
            retorno = consulta.getString("fechaPactada");
        }
        return retorno;
    }

    public String getFechaHoraEntrega(Integer codigoOrden) throws SQLException {
        String retorno = null;
        ResultSet consulta = this.abm_consulta.consulta("Select fechaHoraEntrega "
                + "from Orden where idOrden= "+codigoOrden+" and upper(estadoOrden)<>"
                + "'ANULADA';");
        while (consulta.next()) {
            retorno = consulta.getString("fechaHoraEntrega");
        }
        return retorno;
    }

    public String getHoraPactadaDesde(Integer codigoOrden) throws SQLException {
        String retorno = null;
        ResultSet consulta = this.abm_consulta.consulta("Select horaPactadaDesde "
                + "from Orden where idOrden="+codigoOrden+ " and upper(estadoOrden)<>"
                + "'ANULADA';");
        while (consulta.next()) {
            retorno = consulta.getString("horaPactadaDesde");
        }
        return retorno;
    }

    public String getHoraPactadaHasta(Integer codigoOrden) throws SQLException {
        String retorno = null;
        ResultSet consulta = this.abm_consulta.consulta("Select horaPactadaHasta "
                + "from Orden where idOrden="+codigoOrden+" and upper(estadoOrden)<>"
                + "'ANULADA'" + ";");
        while (consulta.next()) {
            retorno = consulta.getString("horaPactadaHasta");
        }
        return retorno;
    }

    public Double getMontoTotal(Integer codorden) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta("select montoTotal from "
                + "orden where idOrden = " + codorden + " and upper(estadoOrden)"
                + "<>'ANULADA';");

        Double retorno = null;
        while (consulta.next()) {
            retorno = consulta.getDouble("montoTotal");
        }
        return retorno;
    }

    public Double getMontoAbonado(Integer codorden) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta("select montoAbonado from "
                + "orden where idOrden = " + codorden + "and upper(estadoOrden)"
                + "<>'ANULADA';");

        Double retorno = null;
        while (consulta.next()) {
            retorno = consulta.getDouble("montoAbonado");
        }
        if (retorno == null) {
            retorno = new Double(0);
        }
        return retorno;
    }

    public Double getMontoAdeudado(Integer codorden) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta("select montoAdeudado from "
                + "orden where idorden = " + codorden + "and upper"
                + "(estadoOrden)<>'ANULADA';");

        Double retorno = null; //new Integer();  
        while (consulta.next()) {
            retorno = consulta.getDouble("montoAdeudado");
        }
        if (retorno == null) {
            retorno = new Double(0);
        }
        return retorno;
    }

    public boolean getDelivery(Integer codigoOrden) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta("select delivery from "
                + "orden where idorden = " + codigoOrden + " and upper(estadoOrden)<>'ANULADA';");

        boolean retorno = false;
        while (consulta.next()) {
            retorno = consulta.getBoolean("delivery");
        }
        return retorno;
    }

    public String getLugarDeAlmacenajePedidoListo(Integer codorden) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta("select lugarDeAlmacenajePedidoListo"
                + "from orden where idorden = " + codorden + " and lower(estadoOrden)"
                + "='lista';  ");

        String retorno = null; //new Integer();  
        while (consulta.next()) {
            retorno = consulta.getString("lugarDeAlmacenajePedidoListo ");
        }
        return retorno;
    }

    public String getEstadoOrden(Integer codorden) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta("select estadoOrden from "
                + "orden where idorden = " + codorden + ";  ");

        String mostrar = null; 
        while (consulta.next()) {
            mostrar = consulta.getString("estadoOrden");
        }
        return mostrar;
    }

    public List<Integer> getOrdenesPorEstado(String estadoOrden) throws SQLException{
        //ResultSet consulta = this.abm_consulta.consulta("SELECT idorden FROM cantidades where upper(estadoorden)= upper(" + estadoOrden + ");");
        ResultSet consulta = this.abm_consulta.consulta("SELECT idorden,estadoorden FROM orden;");
        List<Integer> resultado = new ArrayList<>(); 
        while (consulta.next()) {
            Integer id = consulta.getInt("idorden");
            String estado = consulta.getString("estadoorden");
            if(estado.equalsIgnoreCase(estadoOrden)){
                resultado.add(id);
            }
        }
        return resultado;
    }
    
    /**
     * @deprecated 
     * @throws SQLException 
     */
    public List<Integer> getOrdenesPendientes(Integer situacionOrden) throws SQLException {

        ResultSet consulta = this.abm_consulta.consulta("SELECT idorden FROM orden where upper(estadoOrden)= '" + situacionOrden + "'");
        List<Integer> mostrar = new ArrayList<>();
        while (consulta.next()) {
            Integer id = consulta.getInt("idorden");
            mostrar.add(id);
        }
        return mostrar;

    }

    /**
     * @deprecated 
     * @throws SQLException 
     */
    public List<Integer> getOrdenesRealizadas(Integer situacionOrden) throws SQLException {

        ResultSet consulta = this.abm_consulta.consulta("SELECT idorden FROM orden where upper(estadoOrden)= '" + situacionOrden + "'");
        List<Integer> mostrar = new ArrayList<>();
        while (consulta.next()) {
            Integer id = consulta.getInt("idorden");
            mostrar.add(id);
        }
        return mostrar;

    }

    public List<Integer> getOrdenesRealizadasParaEntregarElDia(Integer situacionOrden, String fecha) throws SQLException {

        ResultSet consulta = this.abm_consulta.consulta("SELECT idorden FROM orden "
                + "where upper(estadoOrden)= '" + situacionOrden + "'and "
                + "fechaPactada= '" + fecha + "'");
        List<Integer> mostrar = new ArrayList<>();
        while (consulta.next()) {
            Integer id = consulta.getInt("idorden");
            mostrar.add(id);
        }
        return mostrar;

    }

    public List<Integer> getOrdenesPorCliente(Integer codCliente) throws SQLException {

        ResultSet consulta = this.abm_consulta.consulta("SELECT idorden FROM "
                + "orden where idcliente= " + codCliente + " and "
                + "upper(estadoOrden)<>'ANULADA';");
        List<Integer> mostrar = new ArrayList<>();
        while (consulta.next()) {
            Integer id = consulta.getInt("idorden");
            mostrar.add(id);
        }
        return mostrar;
    }
    // modificar cantidades

    public void ModificarCliente(Integer codigoCliente, Integer id) throws SQLException {
        this.abm_consulta.actualizar("update orden set idcliente = " + codigoCliente + "  where idorden = " + id + " ; ");
    }

    /**
     * @deprecated No tiene sentido, no debería modificarse la fecha en que se
     * hizo la cantidades
     */
    public void ModificarFechaPedido(String fecha, Integer id) throws SQLException {
        this.abm_consulta.actualizar("update orden set fechaHoraPedido = " + fecha + "  where idorden = " + id + " ; ");
    }

    public void ModificarFechaEntregaPactada(String fecha, Integer id) throws SQLException {
        this.abm_consulta.actualizar("update orden set fechaPactada = '" + fecha + "'  where idorden = " + id + " ; ");
    }

    public void ModificarFechaEntrega(String fecha, Integer id) throws SQLException {
        this.abm_consulta.actualizar("update orden set fechaHoraEntrega= '" + fecha + "'  where idorden = " + id + " ; ");
    }

    public void ModificarHoraPactadaDesde(String hora, Integer id) throws SQLException {
        this.abm_consulta.actualizar("update orden set horaPactadaDesde= " + hora + "  where idorden = " + id + " ; ");
    }

    public void ModificarHoraPactadaHasta(String hora, Integer id) throws SQLException {
        this.abm_consulta.actualizar("update orden set horaPactadaHasta= " + hora + "  where idorden = " + id + " ; ");
    }

    /**
     * @deprecated Reemplazado por ModificarEstado(String estado, Integer id)
     */
    public void ModificarSituacionEntrega(Integer situacionentrega, Integer id) throws SQLException {
        this.abm_consulta.actualizar("update orden set estadoOrden= " + situacionentrega + "  where idorden = " + id + " ; ");
    }

    public void ModificarMontoTotal(Double monto, Integer id) throws SQLException {
        this.abm_consulta.actualizar("update orden set montoTotal= " + monto + "  where idorden = " + id + " ; ");
    }

    public void ModificarMontoAbonado(Double monto, Integer id) throws SQLException {
        this.abm_consulta.actualizar("update orden set montoAbonado= " + monto + "  where idorden = " + id + " ; ");
    }

    public void ModificarMontoAdeudado(Double monto, Integer id) throws SQLException {
        this.abm_consulta.actualizar("update orden set montoAdeudado= " + monto + "  where idorden = " + id + " ; ");
    }

    public void ModificarLugarAlmacenajePedidoListo(String descripcion, Integer id) throws SQLException {
        this.abm_consulta.actualizar("update orden set lugardealmacenajepedidolisto = '" + descripcion + "'  where idorden = " + id + " ; ");
    }

    public void ModificarEstado(String estado, Integer id) throws SQLException {
        this.abm_consulta.actualizar("update orden set estadoOrden = '" + estado + "'  where idorden = " + id + " ; ");
    }

    /*
     * Se utiliza para cargar servicios
     */
    public void setServicioOrden(Integer codServicio, Integer codOrden,
            Double precio, Integer cantidad) throws SQLException {
        this.abm_consulta.insertar("insert into servicioorden values ("
                + codServicio + ",'" + codOrden + "'," + precio + "," + 
                cantidad+ ");");
    }

    //public void setServicioEsp(Integer codOrden,String descripcionServEspecial,
      //      Double precioServEsp, Integer cantServEsp) throws SQLException {
        //this.abm_consulta.insertar("insert into servicioEspecial values ("
          //     + descripcionServEspecial + "','" + precioServEsp + "','"
            //    + cantServEsp + ");");
    //}

    ///public List<Double> getPrecioServicios(Integer codOrden) throws SQLException {

       // ResultSet consulta = this.abm_consulta.consulta("SELECT precio FROM ServicioOrden where idOrden'" + codOrden + "'");
        //List<Double> precios = new ArrayList<>();
        //while (consulta.next()) {
          //  Double precio = consulta.getDouble("precio");
            //precios.add(precio);
        //}
        //return precios;
    //}

   // public List<Integer> getCodServ(Integer codOrden) {
     //   ResultSet consulta;
       // List<Integer> codigos = null;
        //try {
          //  consulta = this.abm_consulta.consulta("SELECT idServicio FROM ServicioOrden where idOrden'" + codOrden + "'");
            //codigos = new ArrayList<>();
            //while (consulta.next()) {
              //  Integer cod = consulta.getInt("idServicio");
                //codigos.add(cod);
            //}
        //} catch (SQLException ex) {
          //  Logger.getLogger(AdministradorDBOrden.class.getName()).log(Level.SEVERE, null, ex);
        //}
        //return codigos;
    //}
    
    
    /*public Double getPrecioServ(Integer codServ) {
        ResultSet consulta;
        Double precio= null;
        try {
            consulta = this.abm_consulta.consulta("SELECT precioServicio FROM ServicioOrden where idServicio ='" + codServ + "'");
            while (consulta.next()) {
                precio = consulta.getDouble("precioServicio");
            }
        } catch (SQLException ex) {
            Logger.getLogger(AdministradorDBOrden.class.getName()).log(Level.SEVERE, null, ex);
        }
        return precio;
    }

    public List<Integer> getAllCodOrdenes() throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta("SELECT idorden FROM cantidades"
                + "where upper(estadoOrden)<>'ANULADA';");
        Integer mostrar = null;
        ArrayList<Integer> ordenes = new ArrayList<>();
        while (consulta.next()) {
            mostrar = consulta.getInt("idorden");
            ordenes.add(mostrar);
        }
        return ordenes;
    }

    public void setServicioEspecial(Integer codOrden, String desc, Double precio, Integer cantidad) throws SQLException {
        this.abm_consulta.insertar("insert into ServicioEspecial (, idOrden ,servicioEspecial,precioServicioEspecial,cantServEspecial) values ("
                + codOrden + ",'" + desc + "','" + precio + "','" + 
                cantidad+ ");");
    }*/

    public void setServicioEspecial(Integer codOrden, String nombre, Double precio, Integer cantidad,String tipo) throws SQLException {
        this.abm_consulta.insertar("insert into ServicioEspecialOrden (idOrden ,nombre,tiposervesp,precioservicio,cantidad) values ("+codOrden + ",'"+nombre+"','" + tipo + "'," + precio + "," + cantidad+ ");");
    }

    public List<Integer> getAllCodOrdenes() throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT idOrden FROM orden where lower(estadoOrden)<>'anulada';");
        Integer mostrar = null;
        ArrayList<Integer> ordenes = new ArrayList<Integer>();
        while (consulta.next()) {
            mostrar = consulta.getInt("idorden");
            ordenes.add(mostrar);
        }
        return ordenes;
    }
    public Double getPrecioEnServOrden(Integer codServ, Integer codOrden) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT precioservicio FROM servicioorden where idOrden="+codOrden+" and idServicio="+codServ+";");
        Double mostrar = null;
        while (consulta.next()) {
            mostrar = consulta.getDouble("precioservicio");
        }
        return mostrar;
    }

    public Integer getCantEnServOrden(Integer codServ, Integer codOrden) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT cantidad FROM servicioorden where idOrden="+codOrden+" and idServicio="+codServ+";");
        Integer mostrar = null;
        while (consulta.next()) {
            mostrar = consulta.getInt("cantidad");
        }
        return mostrar;
    }

    public String getEstadoEnServOrden(Integer codServ, Integer codOrden) throws SQLException {
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT estado FROM servicioorden where idOrden="+codOrden+" and idServicio="+codServ+";");
        String mostrar = null;
        while (consulta.next()) {
            mostrar = consulta.getString("estado");
        }
        return mostrar;
    }
    
    public List<Integer> getAllCodServicios(Integer cod) throws SQLException{
        List<Integer> lista= new ArrayList();
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT idservicio FROM servicioorden where idOrden="+cod+";");
                //("SELECT idservicio FROM servicioorden;");
        while (consulta.next()) {
            Integer mostrar = consulta.getInt("idservicio");
            lista.add(mostrar);
        }
        
        return lista;
    }
    
    
    public List<Integer> getAllCodServiciosEsp(Integer cod) throws SQLException{
        List<Integer> lista= new ArrayList();
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT idservicioesp FROM servicioespecialorden where idOrden="+cod+";");
       
        while (consulta.next()) {
            Integer mostrar = consulta.getInt("idservicioesp");
            lista.add(mostrar);
        }
        
        return lista;
    }
    
    
    private Integer getCantServPendientesPorEstado(Integer idorden,String tipoServicio) throws SQLException {
        ArrayList<Integer> cantidades=new ArrayList();
        Integer total=0;
        ResultSet consulta = this.abm_consulta.consulta("Select distinct cantidad from servicioOrden so, "
                + "servicio s where so.idServicio=s.idServicio and idOrden="+idorden+" and upper(tipo)=upper('"+tipoServicio+"');");
        while(consulta.next()){
            Integer cant=consulta.getInt("cantidad");
            cantidades.add(cant);
        }
        ListIterator it=cantidades.listIterator();
        while(it.hasNext()){
            Integer cant=(Integer)it.next();
            total=total+cant;
        }
        return total;
    }
    
    private Integer getCantServEspPendientesPorEstado(Integer idorden,String tipoServicio) throws SQLException {
        ArrayList<Integer> cantidades=new ArrayList();
        Integer total=0;
        ResultSet 
        consulta = this.abm_consulta.consulta
                ("Select distinct cantidad from servicioEspecialOrden where idOrden="+idorden+" and tiposervesp='"+tipoServicio+"';");
        while(consulta.next()){
            Integer cant=consulta.getInt("cantidad");
            cantidades.add(cant);
        }
        ListIterator it=cantidades.listIterator();
        while(it.hasNext()){
            Integer cant=(Integer)it.next();
            total=total+cant;
        }
        return total;
    }

    public int getCantPendientesPorEstado(String fechaEntrega, String estado,String tipoServicio) throws SQLException {
        Integer cantServ=0;
        Integer cantServEsp=0;
        ArrayList<Integer> cantidades=new ArrayList();
        Integer idorden;
        
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT distinct idorden FROM orden where fechaPactada='"+fechaEntrega+"' "
                + "and estadoOrden='"+estado+"';");
        while(consulta.next()){
            idorden=consulta.getInt("idOrden");
            cantidades.add(idorden);
        }
        ListIterator it=cantidades.listIterator();
        while(it.hasNext()){
            idorden=(Integer)it.next();
            cantServ=this.getCantServPendientesPorEstado(idorden, tipoServicio)+cantServ;
            cantServEsp =  this.getCantServEspPendientesPorEstado(idorden, tipoServicio)+cantServEsp;
        }
        return cantServ+cantServEsp;
    }

    public String getNombreServicio(Integer codServ) throws SQLException {
        String nombre=null;
        
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT nombre FROM servicio where idServicio="+codServ+";");
        while(consulta.next()){
            nombre=consulta.getString("nombre");
        }
        
        return nombre;
    }

    public String getNombreServicioEsp(Integer codS) throws SQLException {
        String nombre=null;
        
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT nombre FROM servicioespecialorden where idServicioesp="+codS+";");
        while(consulta.next()){
            nombre=consulta.getString("nombre");
        }
        
        return nombre;
    }

    public Double getPrecioEnServOrdenEsp(Integer codS, Integer codOrden) throws SQLException {
        Double precio=null;
        
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT precioservicio FROM servicioespecialorden where idServicioesp="+codS+" and idOrden="+codOrden+";");
        while(consulta.next()){
            precio=consulta.getDouble("precioservicio");
        }
        
        return precio;

    }

    public Integer getCantEnServOrdenEsp(Integer codS, Integer codOrden) throws SQLException {
        Integer cantidad=null;
        
        ResultSet consulta = this.abm_consulta.consulta
                ("SELECT cantidad FROM servicioespecialorden where idServicioesp="+codS+" and idOrden="+codOrden+";");
        while(consulta.next()){
            cantidad=consulta.getInt("precioservicio");
        }
        
        return cantidad;

    }

}
